#ifndef POINT3_H
#define POINT3_H

#include "bga/system/Tuple.h"

namespace bga
{

template< typename T >
class Point3 : public Tuple<3, T>
{
    public:
        /**
         * Default Constructor
         */
        Point3();

        /**
         * Copy Constructor
         */
        Point3(const Point3<T>& point3);

        /**
         * Constructor unsing fields
         * \param x : x value
         * \param y : y value
         * \param z : z value
         */
        Point3(T x, T y, T z);

        /**
         * Destructor
         */
        virtual ~Point3();

        /**
         * Operator needed to assign new value to the current point
         * \param point3 : Point to assign to current point
         */
        Point3<T>& operator=(const Point3& point3);

        /**
         * Set the values of the current point
         * \param x : x value
         * \param y : y value
         * \param z : z value
         */
        void setXYZ(T x, T y, T z);

        T getX() const;
        T getY() const;
        T getZ() const;
};

typedef Point3<float> Point3f;
typedef Point3<double> Point3d;
typedef Point3<int> Point3i;

}

#include "bga/math/Point3.inl"

#endif // POINT3_H
